/**
 * 
 */
package org.yelongframework.model.support.service.adapter;

import java.util.List;

import org.springframework.transaction.annotation.Transactional;
import org.yelongframework.lang.Nullable;
import org.yelongframework.model.Modelable;
import org.yelongframework.model.collector.ModelCollectors;
import org.yelongframework.model.manager.exception.ModelPrimaryKeyException;
import org.yelongframework.model.service.SqlModelService;

/**
 * 模型服务适配器
 * 
 * @since 1.0.0
 */
@Transactional
public interface SqlModelServiceAdapter extends SqlModelService {

	// ==================================================remove==================================================

	/**
	 * 根据主键删除记录
	 * 
	 * @param modelClass model class
	 * @param id         主键值
	 * @return <tt>true</tt> 删除记录数>0
	 * @throws ModelPrimaryKeyException modelClass存在的主键数量不等于1
	 */
	default boolean removeById(Class<? extends Modelable> modelClass, Object id) {
		return collect(ModelCollectors.removeByOnlyPrimaryKeyEQ(modelClass, id)) > 0;
	}

	/**
	 * 根据主键删除多条记录
	 * 
	 * @param modelClass model class
	 * @param ids        主键值数组
	 * @return 删除的记录数
	 * @throws ModelPrimaryKeyException modelClass存在的主键数量不等于1
	 */
	default Integer removeByIds(Class<? extends Modelable> modelClass, Object[] ids) {
		return collect(ModelCollectors.removeByOnlyPrimaryKeyContains(modelClass, ids));
	}

	// ==================================================count==================================================

	/**
	 * 根据id查询记录数<br/>
	 * 
	 * @param modelClass model class
	 * @param id         主键值
	 * @return 符合条件的记录数
	 * @throws ModelPrimaryKeyException modelClass存在的主键数量不等于1
	 */
	default Long countById(Class<? extends Modelable> modelClass, Object id) {
		return collect(ModelCollectors.countByOnlyPrimaryKeyEQ(modelClass, id));
	}

	// ==================================================exist==================================================

	/**
	 * 根据主键查询该记录是否存在<br/>
	 * 
	 * @param modelClass model class
	 * @param id         主键值
	 * @return <tt>true</tt> 符合条件的记录存在
	 * @throws ModelPrimaryKeyException modelClass存在的主键数量不等于1
	 */
	default boolean existById(Class<? extends Modelable> modelClass, Object id) {
		return collect(ModelCollectors.existByOnlyPrimaryKeyEQ(modelClass, id));
	}

	// ==================================================find==================================================

	/**
	 * 根据主键查询模型对象<br/>
	 * 
	 * @param <M>        model type
	 * @param modelClass model class
	 * @return 模型对象集合
	 */
	@Nullable
	default <M extends Modelable> List<M> findAll(Class<M> modelClass) {
		return collect(ModelCollectors.findAll(modelClass));
	}

	/**
	 * 根据主键查询模型对象<br/>
	 * 
	 * @param <M>        model type
	 * @param modelClass model class
	 * @param id         主键值
	 * @return 模型对象
	 * @throws ModelPrimaryKeyException modelClass存在的主键数量不等于1
	 */
	@Nullable
	default <M extends Modelable> M findById(Class<M> modelClass, Object id) {
		return collect(ModelCollectors.getModelByOnlyPrimaryKeyEQ(modelClass, id));
	}

}
